home *** CD-ROM | disk | FTP | other *** search
/ Aminet 38 / Aminet 38 (2000)(Schatztruhe)[!][Aug 2000].iso / Aminet / misc / math / libalgo.lha / algomath / src / rotatex.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-30  |  1.4 KB  |  112 lines

  1. /* rotate the digits of a number n with x place -r left +r right*/
  2.  
  3. #include "defs.h"
  4.  
  5. int am_rotate(int n, int r, int place)
  6. {
  7.  
  8.     int dig[]={0,0,0,0,0,0,0,0,0,0},dig2[10];
  9.     int t=0,x=0,j=0,i;
  10.  
  11.     if(r==0)
  12.         return n;
  13.  
  14.     if(n>999999999)
  15.         return n;
  16.     if(place<0)
  17.         place = -place;
  18.  
  19.  
  20.     if(place>9){
  21.         for(i = 0; i < 9; i++)
  22.             while(place >= _am_asciiconv[i])
  23.                 place -= _am_asciiconv[i];
  24.         while(place >= _am_asciiconv[i])
  25.         {
  26.             place -= _am_asciiconv[i];
  27.             j++;
  28.         }
  29.  
  30.         place=j;
  31.         j=0;
  32.     }
  33.  
  34.     if(n<0){
  35.         n = -n;
  36.         x=1;
  37.     }
  38.  
  39.     while(n >= _am_asciiconv[0])
  40.     {
  41.         n -= _am_asciiconv[0];
  42.         dig[9]++;
  43.     }
  44.  
  45.     while(n >= _am_asciiconv[1])
  46.     {
  47.         n -= _am_asciiconv[1];
  48.         dig[8]++;
  49.     }
  50.  
  51.  
  52.     while(n >= _am_asciiconv[2])
  53.     {
  54.         n -= _am_asciiconv[2];
  55.         dig[7]++;
  56.     }
  57.  
  58.     while(n >= _am_asciiconv[3])
  59.     {
  60.         n -= _am_asciiconv[3];
  61.         dig[6]++;
  62.     }
  63.  
  64.     while(n >= _am_asciiconv[4])
  65.     {
  66.         n -= _am_asciiconv[4];
  67.         dig[5]++;
  68.     }
  69.  
  70.     while(n >= _am_asciiconv[5])
  71.     {
  72.         n -= _am_asciiconv[5];
  73.         dig[4]++;
  74.     }
  75.  
  76.     while(n >= _am_asciiconv[6])
  77.     {
  78.         n -= _am_asciiconv[6];
  79.         dig[3]++;
  80.     }
  81.  
  82.     while(n >= _am_asciiconv[7])
  83.     {
  84.         n -= _am_asciiconv[7];
  85.         dig[2]++;
  86.     }
  87.  
  88.     while(n >= _am_asciiconv[8])
  89.     {
  90.         n -= _am_asciiconv[8];
  91.         dig[1]++;
  92.     }
  93.  
  94.     dig[0]= n;
  95.  
  96.     if(r>0){
  97.         for(j=0;j<place;j++)
  98.             dig2[j]=dig[(j+r)-((j+r)/place)*place];
  99.     }
  100.     else if(r<0){
  101.         for(j=0;j<place;j++)
  102.             dig2[j]=dig[(j+r)+((place-j-r-1)/place)*place];
  103.     }
  104.  
  105. for(j=0;j<place;j++)
  106.     t=t+dig2[j]*_am_asciiconv[9-j];
  107.  
  108. if(x)
  109.     return -t;
  110. else
  111.     return t;
  112. }